/**
 * @content 椭球变换对象功能组件
 * @author lidafeng
 */
import { NativeModules } from 'react-native';

let ET = NativeModules.JSElpTransformation;

import ElpParam from './ElpParam.js';
import ElpTransParam from './ElpTransParam.js';
/**
 * @class ElpTransformation
 */
export default class ElpTransformation {
  /**
   * 获取椭球个数
   * @memberOf ElpTransformation
   * @return {Promise.<Number>}  椭球个数
   */
  static async getElpParamCount() {
    try {
      return await ET.getElpParamCount();
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 根据椭球索引，获取椭球参数
   * @memberOf ElpTransformation
   * @param index 椭球索引
   * @return {Promise.<ElpParam>} 成功返回椭球参数对象，失败返回空
   */
  static async getElpParamByIndex(index) {
    try {
      let { ElpParamId } = await ET.getElpParam(index);
      var elpParam = new ElpParam();
      elpParam._MGElpParamId = ElpParamId;

      return elpParam;
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 根据椭球名称，获取椭球参数
   * @memberOf ElpTransformation
   * @param name 椭球名称
   * @return {Promise.<ElpParam>} 成功返回椭球参数对象，失败返回空
   */
  static async getElpParamByName(name) {
    try {
      let { ElpParamId } = await ET.getElpParam(name);
      var elpParam = new ElpParam();
      elpParam._MGElpParamId = ElpParamId;

      return elpParam;
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 根据椭球索引，设置或替换椭球参数（不永久保存）
   * @memberOf ElpTransformation
   * @param index 椭球索引
   * @param param 椭球参数
   * @return {Promise.<void>}
   */
  static async setElpParam(index, param) {
    try {
      await ET.setElpParam(index, param._MGElpParamId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 椭球坐标系变换参数对象个数
   * @memberOf ElpTransformation
   * @return {Promise.<Number>} 椭球坐标系变换参数个数
   */
  static async getElpTransParamCount() {
    try {
      return await ET.getElpTransParamCount();
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 根据索引，获取椭球转换参数对象
   * @memberOf ElpTransformation
   * @param index 转换参数的索引值
   * @return {Promise.<ElpTransParam>} 成功返回椭球转换参数对象，失败返回空
   */
  static async getElpTransParamByIndex(index) {
    try {
      let { ElpTransParamId } = await ET.getElpTransParam(index);
      var elpTransParam = new ElpTransParam();
      elpTransParam._MGElpTransParamId = ElpTransParamId;

      return elpTransParam;
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 根据名称，获取椭球转换参数
   * @memberOf ElpTransformation
   * @param name 椭球转换参数对象的名称
   * @return {Promise.<ElpTransParam>} 成功返回椭球转换参数对象，失败返回空
   */
  static async getElpTransParamByName(name) {
    try {
      let { ElpTransParamId } = await ET.getElpTransParam(name);
      var elpTransParam = new ElpTransParam();
      elpTransParam._MGElpTransParamId = ElpTransParamId;

      return elpTransParam;
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 修改/设置椭球转换参数
   * @memberOf ElpTransformation
   * @param index 椭球转换参数对象索引
   * @param param 椭球转换参数对象
   * @return {Promise.<boolean>} 成功返回true，失败返回false
   */
  static async setElpTransParamByIndex(index, param) {
    try {
      return await ET.setElpTransParam(index, param._MGElpTransParamId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 修改/设置椭球转换参数
   * @memberOf ElpTransformation
   * @param name 椭球转换参数对象名称
   * @param param 椭球转换参数对象
   * @return {Promise.<boolean>} 成功返回true，失败返回false
   */
  static async setElpTransParamByName(name, param) {
    try {
      return await ET.setElpTransParam(name, param._MGElpTransParamId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 添加椭球坐标系变换参数对象
   * @memberOf ElpTransformation
   * @param param 椭球坐标系变换参数对象
   * @return {Promise.<Number>} 成功则返回椭球参数对象索引
   */
  static async addElpTransParam(param) {
    try {
      return await ET.addElpTransParam(param._MGElpTransParamId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 根据索引删除椭球坐标系变换参数对象
   * @memberOf ElpTransformation
   * @param index 椭球转换参数对象索引
   * @return {Promise.<boolean>} 成功返回true，失败返回false
   */
  static async delElpTransParamByIndex(index) {
    try {
      return await ET.delElpTransParam(index);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 根据索引删除椭球坐标系变换参数对象
   * @memberOf ElpTransformation
   * @param name 椭球转换参数对象名称
   * @return {Promise.<boolean>} 成功返回true，失败返回false
   */
  static async delElpTransParamByName(name) {
    try {
      return await ET.delElpTransParam(name);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 清空椭球坐标系变换参数对象
   * @memberOf ElpTransformation
   * @return {Promise.<boolean>} 成功返回true，失败返回false
   */
  static async clearElpTransParam() {
    try {
      return await ET.clearElpTransParam();
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 导入椭球变换参数
   * @memberOf ElpTransformation
   * @param strFile 文件URL
   * @return {Promise.<boolean>} 成功返回true，失败返回false
   */
  static async loadElpTransParam(strFile) {
    try {
      return await ET.loadElpTransParam(strFile);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 从文件导入椭球转换参数
   * @memberOf ElpTransformation
   * @param strFile 文件URL
   * @return {Promise.<ElpTransParam>} 成功返回椭球转换对象列表，失败返回空
   */
  static async loadElpTransParam0(strFile) {
    try {
      var objArr = [];
      let { ElpTransParamArr } = await ET.loadElpTransParam0(strFile);
      for (var i = 0; i < ElpTransParamArr.length; i++) {
        var elpTransParam = new ElpTransParam();
        elpTransParam._MGElpTransParamId = ElpTransParamArr[i];
        objArr.push(elpTransParam);
      }
      return objArr;
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 导出椭球变换参数
   * @memberOf ElpTransformation
   * @param strFile 文件URL
   * @return {Promise.<boolean>}成功返回true，失败返回false
   */
  static async saveElpTransParam(strFile) {
    try {
      return await ET.saveElpTransParam(strFile);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 根据控制点结构对象序列，计算椭球参数转换对象
   * @memberOf ElpTransformation
   * @param transType 转换类型(0/1:三参数直角平移/七参数)
   * @param pnts 控制点结构对象序列
   * @param sourceSpheroid 椭球体索引(1开始)
   * @param sourceAngUnit 获取空间数据水平坐标单位：角度(4/7/3/5:度/分/秒/度分秒)
   * @param spheroid 椭球体索引(1开始)
   * @param angUnit 获取空间数据水平坐标单位：角度(4/7/3/5:度/分/秒/度分秒)
   * @return {Promise.<ElpTransParam>} 椭球坐标系变换参数
   */
  static async countCoeByPntList(
    transType,
    pnts,
    sourceSpheroid,
    sourceAngUnit,
    spheroid,
    angUnit
  ) {
    try {
      let { ElpTransParamId } = await ET.countCoeByPntList(
        transType,
        pnts,
        sourceSpheroid,
        sourceAngUnit,
        spheroid,
        angUnit
      );
      var elpTransParam = new ElpTransParam();
      elpTransParam._MGElpTransParamId = ElpTransParamId;
      return elpTransParam;
    } catch (e) {
      console.error(e);
    }
  }
}
